package cn.xyw.solr;

import cn.xyw.pojo.Item;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.junit.Test;

import java.util.List;
import java.util.Map;

/**
 * @author Evan
 * @Title: SolrIndexSuperQuery
 * @ProjectName solr
 * @Description: TODO
 * @date 2018/7/522:20
 */
public class SolrIndexSuperQuery {

    @Test
    /**
    　　* @Description: 布尔查询
    　　* @param []
    　　* @return void
    　　* @author Evan
    　　* @date 2018/7/5 22:22
    　　*/
    public void testQueryBoolean() throws SolrServerException {
        // 连接Solr服务器
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2");

        // 创建查询对象
        //SolrQuery query = new SolrQuery("title:iphone OR title:小米");
        SolrQuery query = new SolrQuery("title:iphone AND id:13");

        // 执行查询返回结果
        QueryResponse response = server.query(query);


        // 查询到的结果,本质是一个document集合
        SolrDocumentList results = response.getResults();
        // 获取总条目数
        System.out.println("本次搜索到:"+results.size()+"条数据");

        // 遍历集合
        for (SolrDocument result : results) {
            System.out.println("id:"+result.getFieldValue("id"));
            System.out.println("title:"+result.getFieldValue("title"));
            System.out.println("price:"+result.getFieldValue("price"));
        }

    }

    @Test
    /**
     　　* @Description: 相似度(模糊)查询
     　　* @param []
     　　* @return void
     　　* @author Evan
     　　* @date 2018/7/5 22:22
     　　*/
    public void testQueryFuzzy() throws SolrServerException {
        // 连接Solr服务器
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2");

        // 创建查询对象
        // 允许编辑距离为0-2,默认是2
        SolrQuery query = new SolrQuery("title:iphame~");

        // 执行查询返回结果
        QueryResponse response = server.query(query);


        // 查询到的结果,本质是一个document集合
        SolrDocumentList results = response.getResults();
        // 获取总条目数
        System.out.println("本次搜索到:"+results.size()+"条数据");

        // 遍历集合
        for (SolrDocument result : results) {
            System.out.println("id:"+result.getFieldValue("id"));
            System.out.println("title:"+result.getFieldValue("title"));
            System.out.println("price:"+result.getFieldValue("price"));
        }

    }

    @Test
    /**
     　　* @Description: 范围查询
     　　* @param []
     　　* @return void
     　　* @author Evan
     　　* @date 2018/7/5 22:22
     　　*/
    public void testQueryRange() throws SolrServerException {
        // 连接Solr服务器
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2");

        // 创建查询对象(包右不包左)
        SolrQuery query = new SolrQuery("price:[139900 TO 299900]");

        // 执行查询返回结果
        QueryResponse response = server.query(query);


        // 查询到的结果,本质是一个document集合
        SolrDocumentList results = response.getResults();
        // 获取总条目数
        System.out.println("本次搜索到:"+results.size()+"条数据");

        // 遍历集合
        for (SolrDocument result : results) {
            System.out.println("id:"+result.getFieldValue("id"));
            System.out.println("title:"+result.getFieldValue("title"));
            System.out.println("price:"+result.getFieldValue("price"));
        }

    }

    @Test
    /**
     　　* @Description: 排序查询
     　　* @param []
     　　* @return void
     　　* @author Evan
     　　* @date 2018/7/5 22:22
     　　*/
    public void testQuerySort() throws SolrServerException {
        // 连接Solr服务器
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2");

        // 创建查询对象
        SolrQuery query = new SolrQuery("title:手机");

        //设置产查询的排序参数, 参数: 排序的字段名,排序的方式
        query.setSort("price", SolrQuery.ORDER.asc);


        // 执行查询返回结果
        QueryResponse response = server.query(query);


        // 查询到的结果,本质是一个document集合
        SolrDocumentList results = response.getResults();
        // 获取总条目数
        System.out.println("本次搜索到:"+results.size()+"条数据");

        // 遍历集合
        for (SolrDocument result : results) {
            System.out.println("id:"+result.getFieldValue("id"));
            System.out.println("title:"+result.getFieldValue("title"));
            System.out.println("price:"+result.getFieldValue("price"));
        }

    }

    @Test
    /**
     　　* @Description: 分页查询
     　　* @param []
     　　* @return void
     　　* @author Evan
     　　* @date 2018/7/5 22:22
     　　*/
    public void testPageQuery() throws SolrServerException {

        // 准备分页参数
        int curPage = 1;
        // 每页显示条数
        final int Page_Size = 5;
        // 当前页的起始条数
        int start = (curPage - 1)*Page_Size;



        // 连接Solr服务器
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2");

        // 创建查询对象
        SolrQuery query = new SolrQuery("title:手机");

        // 设置分页信息到查询对象中
        query.setStart(start);
        query.setRows(Page_Size);

        // 执行查询返回结果
        QueryResponse response = server.query(query);


        // 查询到的结果,本质是一个document集合
        SolrDocumentList results = response.getResults();
        // 获取总条目数
        System.out.println("本次搜索到:"+results.size()+"条数据");

        // 遍历集合
        for (SolrDocument result : results) {
            System.out.println("id:"+result.getFieldValue("id"));
            System.out.println("title:"+result.getFieldValue("title"));
            System.out.println("price:"+result.getFieldValue("price"));
        }

    }

    @Test
    /**
     　　* @Description: 高亮查询
     　　* @param []
     　　* @return void
     　　* @author Evan
     　　* @date 2018/7/5 22:22
     　　*/
    public void testHighlighterQuery() throws SolrServerException {


        // 连接Solr服务器
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core2");

        // 创建查询对象
        SolrQuery query = new SolrQuery("title:手机");

        // 设置高亮标签
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("<em>");

        // 设置高亮字段
        query.addHighlightField("title");

        // 执行查询返回结果
        QueryResponse response = server.query(query);

        /*
            解析高亮响应结果,是个Map
            外层的Map: 它的key是文档的id,value是一个Map,存放的是这个文档的其他高亮字段
            内层的Map: 是其他高亮字段,key是其他字段的名称,value是这个字段的值,这个值是一个List
         */
        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

        List<Item> list = response.getBeans(Item.class);
        for (Item item : list) {
            String id = item.getId();
            System.out.println("id:"+id);
            System.out.println("title:"+highlighting.get(id).get("title").get(0));
            System.out.println("price:"+item.getPrice());
        }
        
    }
}
